-
Notifications
You must be signed in to change notification settings - Fork 148
LoongArch: BPF: Fix incorrect return pointer value in the eBPF program #9496
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Upstream branch: 0786654 |
c210f22
to
2530e45
Compare
Upstream branch: dc0fe95 |
e00235c
to
f6abc20
Compare
2530e45
to
61c9cef
Compare
Upstream branch: c80d797 |
f6abc20
to
d1dc9a9
Compare
61c9cef
to
715d6cb
Compare
Upstream branch: 3ec8560 |
d1dc9a9
to
7f891d0
Compare
715d6cb
to
506c27a
Compare
Upstream branch: 1274163 |
7f891d0
to
65095f9
Compare
506c27a
to
76c716d
Compare
Upstream branch: d87fdb1 |
65095f9
to
67d7ed4
Compare
76c716d
to
f3b4b37
Compare
Upstream branch: dbe99ea |
67d7ed4
to
bcc7f83
Compare
f3b4b37
to
bf66d41
Compare
Upstream branch: 6850a33 |
bcc7f83
to
1f095bb
Compare
bf66d41
to
74b5324
Compare
Upstream branch: dbe99ea |
1f095bb
to
75f4aff
Compare
74b5324
to
c3c6b4b
Compare
Upstream branch: 5c42715 |
75f4aff
to
466641b
Compare
c3c6b4b
to
1a79214
Compare
Upstream branch: bf7a6a6 |
In some eBPF programs, the return value is a pointer. When the kernel call an eBPF program (such as struct_ops), it expects a 64-bit address to be returned, but instead a 32-bit value. Before applying this patch: ./test_progs -a ns_bpf_qdisc CPU 7 Unable to handle kernel paging request at virtual address 0000000010440158. As shown in the following test case, bpf_fifo_dequeue return value is a pointer. progs/bpf_qdisc_fifo.c SEC("struct_ops/bpf_fifo_dequeue") struct sk_buff *BPF_PROG(bpf_fifo_dequeue, struct Qdisc *sch) { struct sk_buff *skb = NULL; ........ skb = bpf_kptr_xchg(&skbn->skb, skb); ........ return skb; } kernel call bpf_fifo_dequeue: net/sched/sch_generic.c static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, int *packets) { struct sk_buff *skb = NULL; ........ skb = q->dequeue(q); ......... } When accessing the skb, an address exception error will occur. because the value returned by q->dequeue at this point is a 32-bit address rather than a 64-bit address. After applying the patch: ./test_progs -a ns_bpf_qdisc Warning: sch_htb: quantum of class 10001 is small. Consider r2q change. 213/1 ns_bpf_qdisc/fifo:OK 213/2 ns_bpf_qdisc/fq:OK 213/3 ns_bpf_qdisc/attach to mq:OK 213/4 ns_bpf_qdisc/attach to non root:OK 213/5 ns_bpf_qdisc/incompl_ops:OK 213 ns_bpf_qdisc:OK Summary: 1/5 PASSED, 0 SKIPPED, 0 FAILED Fixes: 73c359d ("LoongArch: BPF: Sign-extend return values") Signed-off-by: Jinyang He <[email protected]> Signed-off-by: Haoran Jiang <[email protected]> ---------- v2: 1,add emit_slt* helpers 2,Use slt/slld/srad instructions to avoid branch
466641b
to
fb60062
Compare
At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=991838 irrelevant now. Closing PR. |
Pull request for series with
subject: LoongArch: BPF: Fix incorrect return pointer value in the eBPF program
version: 2
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=991838